<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

    <script>

        var obj = {
            name: 'lucky',
            age: 12
        }

        console.log(obj.name, obj.age);

        var proxy = new Proxy(obj, {
            get(target, attr) {
                if (attr in target) {
                    return target[attr]
                } else {
                    throw new Error('请求的数据不存在') // 自定义获取不到属性时的返回值
                }
            },
            set(target, key, value) {
                if (key == 'age' && value > 100) {
                    throw new Error('年龄不能大于100')
                } else {
                    target[key] = value
                }
            }
        })
        
        try{
            console.log(proxy.address);
        } catch(error) {
            console.log(error);
        }

        /* /Proxy 可以理解成，在目标对象之前架设一层“拦截”，外界对该对象的访问，都必须先通过这层拦截，
			//因此提供了一种机制，可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理，用在这里表示由它来“代理”某些操作，可以译为“代理器”。
	get(target, propKey, receiver)：拦截对象属性的读取，比如`proxy.foo`和`proxy['foo']`
		
		`get`方法用于拦截某个属性的读取操作，可以接受三个参数，依次为目标对象、属性名和 proxy 实例本身（严格地说，是操作行为所针对的对象），其中最后一个参数可选。	
		set(target, propKey, value, receiver)**：拦截对象属性的设置，比如`proxy.foo = v`或`proxy['foo'] = v`，返回一个布尔值。
		
		set`方法用来拦截某个属性的赋值操作，可以接受四个参数，依次为目标对象、属性名、属性值和 Proxy 实例本身，其中最后一个参数可选 */
    </script>
</body>
</html>